package Leetcode;

import base.ListNode;

/**
 * 给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。
 */
public class 力扣19_删除链表的倒数第N个结点 {
    public static void main(String[] args) {
        ListNode a = new ListNode(1);
        ListNode b = new ListNode(2);
        ListNode c = new ListNode(3);
        ListNode d = new ListNode(4);
        ListNode e = new ListNode(5);
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = e;
        ListNode listNode = removeNthFromEnd(a, 1);
        System.out.println(listNode);
    }

    static ListNode removeNthFromEnd(ListNode head, int n) {
        // 首先定义节点
        ListNode delNodePre = null;
        ListNode delNode = head;
        ListNode curNode = head;
        // 先让当前节点往后移动 n-1位
        for (int i = 1; i < n; i++) {
            if (curNode.next == null) {
                return head;
            }
            curNode = curNode.next;
        }
        // 两个节点一起往后移动 直到最后
        while (curNode.next != null) {
            curNode = curNode.next;
            delNodePre = delNode;
            delNode = delNode.next;
        }
        // 要删除的节点未移动 说明要删除第一个
        if (delNodePre == null) {
            return head.next;
        }
        // 将要删除的节点删除 返回头节点
        delNodePre.next = delNodePre.next.next;
        return head;
    }
}
